// Clase barrier implementada mediante Semaforos
// Metodos: syncro
// Fecha: Noviembre 2003

package Barrera;

import Semaforo.*;

public class barrier {
  private Semaforo mut; // Semaforo de Exclusion mutua
  private Semaforo stop; // Semaforo para parar a los procesos
  private int num_proc; // Numero de procesos que intervienen en barrera
  private int num_act_proc; // Numero actual de procesos que han llegado a la barrera
  private int resp_correcta;
  private boolean respuesta_no_encontrada;

  // Constructor
  public barrier(int n) {
    mut = new Semaforo(1);
    stop = new Semaforo(0);
    num_proc = n; 
    num_act_proc = 0;
    resp_correcta = 8;
    respuesta_no_encontrada = true;
  } // Constructor

  // Operacion syncro
  public void syncro() {
    mut.Wait();
    num_act_proc++;
    if (num_act_proc < num_proc) {
      mut.Signal();
      stop.Wait();
    } // if ...
    // Hemos alcanzado todos la barrera
    num_act_proc--;
    if (num_act_proc > 0)
      stop.Signal();
    else
      mut.Signal();
  } // syncro

  // Operacion syncro
  public void syncro(int id, int resp) {
    mut.Wait();
    num_act_proc++;
    if (num_act_proc < num_proc) {
      mut.Signal();
      stop.Wait();
    } // if ...
    // Hemos alcanzado todos la barrera
    if (respuesta_no_encontrada)
      if (resp == resp_correcta) {
        System.out.println("Ganador " + id);
        respuesta_no_encontrada = false;
      }

    num_act_proc--;
    if (num_act_proc > 0)
      stop.Signal();
    else {
      respuesta_no_encontrada = true;
      mut.Signal();
    }
  } // syncro
} // barrier

